一. 数组的创建与初始化
1. 创建时不必马上初始化
1 | int[] a = new int[10]; |
1 | int[] a2; |
都是可以的
2. 初始化的简便方法
上面的代码勉强算是初始化了, 因为有了默认值. 如果我们需要将元素初始化为我们需要的值, 只能通过下标一个一个地给元素赋值, 除此之外, 可以在创建数组的时候, 不使用 new, 直接给给元素赋值.
1 | int[] b = {1, 2, 3, 5, 4, 3, 99, 0, -4, 1, 9}; |
3. 错误的初始化方法
先创建数组, 然后通过简便方法初始化, 这种方法是错误的.
1 | int[] a2; |
这种写法也是错的, 但我不知道为什么. 2017年12月11日 20:22:38
1 | int[10] a; |
二. 数组的默认值
1. 原始数据类型数组的默认值
类似 int, float, double 都属于原始数据类型, int 类型数组默认值 0, float, double 类型数组默认值都是 0.0.
2. 对象数组元素的默认值
在执行下面这句话之后, 数组 s 中的每个元素都有了初始值: null
1 | String s = new String[10]; |
但是这些元素并没有指向一个对象, 如果对这些元素进行操作, 可能就报错了.
初始化的方法:
1 | s[0] = new String("初始化"); |
三. 数组的传递
1. 直接传递数组名
按照 C 语言的想法, 通过数组名传递, 相当于传递地址, 所以是可以修改主调函数里面的值的.
通过测试, 将主函数里面的 String 数组传递到函数内部, 在函数内部修改数组元素, 主函数中数组的元素也被修改了.
2. 传递数组元素
A. 原始数据类型元素
例如传递 int 数组的某个元素, 是不会改变主调函数里面的值.
B. 引用类型元素
对象类型数组的元素都是引用类型, 它们类似于指针(猜的), 所以传递过去是可以修改主调函数里面的值.
四. 数组的赋值
a, b 是两个数组, 当执行 a = b 的时候, 此时 a, b 指向相同的内存. 也就是说, a 和 b 代表同一个数组.
五. 数组的拷贝
1 | System.arraycopy(a, 0, b, 0, 10); |
上面这行代码的含义是把 a 中的元素的值赋给 b.
需要注意两点:
- 数组拷贝时长度不能超出范围, 否则会报错
- 数组的赋值使两个数组指向同一块内存, 而数组的拷贝只是将拷贝元素的值.
并且, 对对象数组进行拷贝之后, 两个数组对应的值相等, 但是对象的元素并不指向相同的内存.1
2
3
4
5
6
7
8
9
10
11
12
13
14
15String[] string1 = new String[1];
string1[0] = "我是一个字符串";
String[] string = new String[10];
//string1 的 0 号元素赋值给 string 的 0 号元素
System.arraycopy(string1, 0, string, 0, 1);
//string 中 0 号元素的值已经被修改
print(string);
//尝试修改 string 中 0 号元素的值
string[0] = "这个元素已经被修改了";
//发现 string1[0] 的值没有被修改, 说明两个引用指向的不是同一块内存
print(string1); //输出"我是一个字符串"
六. 数组的常用操作
数组的常见操作:
1 | import java.util.Arrays; |
七. 注意事项:
- 使用对象数组的元素之前要让它先指向一个对象, 否则会出现异常